.TITLE DRGTP .IDENT /10.00/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; D. N. CUTLER 30-AUG-73 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ; ; T. M. MARTIN ; ; MODIFIED FOR RSX-11M-PLUS V2.1 BY: ; ; B. S. MCCARTHY ; T. LEKAS ; ; MODIFIED FOR RSX-11M-PLUS V4.2 BY: ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS V4.6 BY: ; ; D. Carroll 1-Jul-1998 10.00 ; DC506 - Include full support for leap year calculation ; including century determination. ; ;+ ; **-$DRGTP-GET TIME PARAMETERS / SET SYSTEM TIME ; ; THE GET TIME DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A SPECIFIED EIGHT ; WORD BUFFER WITH THE CURRENT TIME PARAMETERS. ; ; THE SET SYSTEM TIME DIRECTIVE INSTRUCTS THE SYSTEM TO OPTIONALLY ; FILL A SPECIFIED EIGHT WORD BUFFER WITH THE CURRENT TIME PARAMETERS ; AND TO RESET THE SYSTEM TIME USING A SPECIFIED TIME AND DATE. ; ; ; DPB FORMAT FOR GET TIME PARAMETERS DIRECTIVE: ; ; WD. 00 -- DIC(61.),DPB SIZE(2.). ; WD. 01 -- ADDRESS OF AN EIGHT WORD BUFFER. ; ; DPB FORMAT FOR SET SYSTEM TIME DIRECTIVE: ; ; WD. 00 -- DIC(61.),DPB SIZE(3.). ; WD. 01 -- ADDRESS OF AN EIGHT WORD NEW TIME SPECIFICATION ; WD. 02 -- ADDRESS OF AN EIGHT WORD OUTPUT BUFFER (OLD TIME) ; ; ; BUFFER FORMAT: ; ; WD. 00 -- YEAR SINCE 1900. ; WD. 01 -- MONTH OF YEAR. ; WD. 02 -- DAY OF MONTH. ; WD. 03 -- HOUR OF DAY. ; WD. 04 -- MINUTE OF HOUR. ; WD. 05 -- SECOND OF MINUTE. ; WD. 06 -- TICK OF SECOND. ; WD. 07 -- TICKS PER SECOND. ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE SECOND WORD IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF BUFFER IS ; OUTSIDE OF ISSUING TASK'S ADDRESS SPACE. ;- ; $DRGTP:: MOVB -(R3),R4 ;GET DPB LENGTH CMPB (R3)+,#2 ;GET TIME PARAMETERS DIRECTIVE? .IF DF R$$PRO BNE 4$ ;IF NE NO - TRY SET TIME BIT #H2.ITF,$HFMSK+2 ;IS THE DATA VALID FROM THE ;HARDWARE DATE/TIME CLOCK? BNE 40$ ;IF NE NO - RETURN INVALID TIME FORMAT BR 5$ ;THE TIME IS VALID - RETURN IT .IFF ;R$$PRO BEQ 5$ ;IF EQ YES .ENDC ;R$$PRO 4$: CMPB R4,#3 ;SET SYSTEM TIME DIRECTIVE? BNE 41$ ;IF NE, ILLEGAL DPB LENGTH BIT #T3.PRV,T.ST3(R5) ;TASK PRIVILEGED? BNE 3$ ;IF NE YES DRSTS D.RS16 ;ELSE PRIVILEGE VIOLATION 3$: MOV (R3)+,R5 ;COPY VIRTUAL ADDRESS OF NEW TIME 5$: MOV (R3)+,R3 ;GET PREVIOUS TIME BUFFER ADDRESS BNE 7$ ;IF NE, THERE IS A PREVIOUS TIME BUFFER BIT #1,R4 ;IS THIS A SET TIME? BNE 15$ ;IF NE YES, OLD TIME BUFFER IS OPTIONAL 7$: MOV #8.*2,R1 ;SET LENGTH OF BUFFER IN BYTES CALL $ACHKP ;ADDRESS CHECK PARAMETER BUFFER MOV #$TTNS-14,R1 ;POINT TO CURRENT TIME VECTOR 10$: MOV (R1)+,(R3)+ ;INSERT TIME PARAMETER IN TASK BUFFER CMP R1,#$TTNS ;ANY MORE TO INSERT? BLOS 10$ ;IF LOS YES MOV $TKPS,(R3) ;SET TICKS PER SECOND 15$: ROR R4 ;SET SYSTEM TIME DIRECTIVE? BCS 17$ ;IF CS SETTIM REQUEST ;DC506 ;DC506 JMP 90$ ; BRANCH AID ;DC506 ;DC506 17$: MOV R5,R3 ;GET NEW TIME BUFFER ADDRESS ;DC506 MOV #8.*2,R1 ;SET LENGTH OF NEW TIME BUFFER ;**-2 CALL $ACHKP ;ADDRESS CHACK AND MAP NEW TIME BUFFER MOV #$TTNS+2,R1 ;POINT TO CURRENT TIME VECTOR 20$: MOV -(R1),-(SP) ;COPY TIME PARAMETER CMP R1,#$TTNS-14 ;MORE TO COPY? BHI 20$ ;IF HI YES CLR R2 ;INITIALIZE FEBRUARY DPM ADJUSTMENT MOV SP,R5 ;POINT TO CURRENT YEAR PARAMETER MOV #$TKPS-14,R1 ;POINT TO TIME LIMITS VECTOR CALL 100$ ;VALIDATE YEAR BIT #3,R0 ;LEAP YEAR? BNE 25$ ;IF NE NO MOV R1,-(SP) ; save R1 for a bit ;DC506 MOV R0,R1 ; copy the year to R1 ;DC506 CLR R0 ; zero the high portion ;DC506 ADD #1900.,R1 ; adjust for correct century ;DC506 DIV #100.,R0 ; check for century limit ;DC506 TST R1 ; is it divisible by 100. ;DC506 BNE 23$ ; if NE, it is a leap year ;DC506 ;DC506 BIT #3,R0 ; is the year divisible by 400. ;DC506 BNE 24$ ; if NE, nope, not a leap year ;DC506 ;DC506 23$: INC R2 ;SET FEB CONSTANT ;DC506 24$: MOV (SP)+,R1 ; restore R1 limit pointer ;DC506 ;DC506 25$: ;**-1 CALL 100$ ;VALIDATE MONTH BLOS 40$ ;IF C=1 OR Z=1 THEN INVALID MONTH DEC R0 ;NORMALIZE TO ZERO BNE 27$ ;IF NE, THEN NOT JANUARY ADD #12.,R0 ;ELSE ADJUST TABLE INDEX FOR JANUARY 27$: CMP R0,#1 ;FEBRUARY? BEQ 28$ ;IF EQ, YES CLR R2 ;ELSE CLEAR ANY DPM ADJUSTMENT 28$: MOVB $DYPMN-1(R0),R4 ;GET NUMBER OF DAYS FOR THIS MONTH ADD R4,R2 ;CALCULATE DAYS-PER-MONTH CALL 100$ ;VALIDATE DAY BEQ 40$ ;IF Z=1 THEN ILLEGAL DAY DEC R2 ;NORMALIZE REFERENCE CMPB R2,R0 ;DAY SPECIFIED HIGHER THAN CALC'D DPM? MOV #4,R4 ;VALIDATE HR,MIN,SEC,TICK 30$: CALL 100$ ; SOB R4,30$ ; BCS 40$ ;IF CS, THEN INVALID TICK OF SECOND MOV (R3),R0 ;GET GRANULARITY (TICKS PER SECOND) CMP -(R1),R0 ;CORRECT TICK PER SECONDS ON CURRENT SYSTEM? BEQ 50$ ;IF EQ YES CMP R0,#-1 ;DEFAULTED GRANULARITY? BEQ 50$ ;IF EQ YES 40$: DRSTS D.RS93 ;INVALID TIME PARAMETER 41$: DRSTS D.RS99 ;INVALID DPB LENGTH 50$: INC R2 ;CORRECT DPM MOV R2,$TKPS-10 ;UPDATE NEW DAYS/MONTH LIMIT .IF DF A$$CNT MOV R5,R3 ;COPY TOP OF STACK POINTER SUB #3,R3 ;ADJUST POINTER TO NEW TIME TST $SABPT ;ACCOUNTING ACTIVE? BEQ 70$ ;IF EQ NO MOV #$TKPS+2,R4 ;POINT TO OLD TIME VECTOR MOV #/64.,R1 ;SET NUMBER OF BLKS TO ALLOCATE CALL $ALACC ;ALLOCATE ACCOUNTING TRANSACTION BLK BCS 70$ ;IF CS, ALLOCATION FAILURE MOV R0,KISAR6 ;MAP TRANSACTION BLOCK MOV #+BT.TIM,140000+B.TYP ;FILL IN TRANSACTION TYPE AND LENGTH MOV #140000+B.TNEW+6,R2 ;INIT OFFSET INTO OLD TIME VECTOR MOV #140000+B.TOLD,R1 ;INIT OFFSET INTO NEW TIME VECTOR 60$: MOVB -(R3),-(R2) ;PLACE NEW TIME INTO TRANSACTION BLK MOVB (R4)+,(R1)+ ;PLACE OLD TIME INTO TRANSACTION BLK CMPB -(R3),(R4)+ ;ADJUST POINTERS CMP R3,SP ;MORE TIME PARAMETERS TO MOVE? BHI 60$ ;IF NE YES MOV R0,R1 ;COPY TRANSACTION BLK MAPPING BIAS CALL $QACNT ;QUEUE ACCOUNTING TRANSACTION .ENDC ;A$$CNT 70$: ;REFERENCE LABEL .IF DF E$$LOG SEC ;ASSUME NO ERROR LOG PKT BIT #ES.LOG,$ERFLA ;IS ERROR LOGGING TURNED ON? BEQ 75$ ;IF EQ NO MOV #E$CCTL+<400*E$STIM>,R0 ;GET THE ENTRY CODE MOV #12.,R1 ;DATA SUBPACKET IS 12. BYTES LONG MOV #SM.HDR!SM.TSK!SM.DAT,R2 ;GET INFORMATION TO RECORD MOV SP,R3 ;SET UP R3 TO POINT AT ;ANYTHING THE CORRECT DATA ;SUBPACKET CONTENTS WILL BE ;FILLED IN LATER. MOV $TKTCB,R4 ;GET THE CURRENT TASK TCB ADDRESS CALL $CRPKT ;CREATE THE PACKET .IFTF ; DF E$$LOG 75$: MOV #$TTNS-14,R4 ;POINT PAST CURRENT TIME VECTOR MOV #6,R5 ;MOV 6 WDS OF NEW TIME VEC 80$: ;REFERENCE LABEL .IFT ; DF E$$LOG BCS 85$ ;IF CS NO ERRLOG PKT MOVB (SP),(R1)+ ;FILL IN DATA PACKET .IFTF ; DF E$$LOG 85$: MOV (SP)+,(R4)+ ;SET NEW TIME PARAMETER SOB R5,80$ ;VECTOR IN PLACE MOV (SP)+,(R4)+ ;RETURN NEW TICK_OF_SECOND .IFT ; DF E$$LOG BCS 90$ ;IF CS, NO ERRLOG PKT CALL $QUPKT ;ELSE QUEUE IT .ENDC ; DF E$$LOG .IF DF R$$PRO BIC #H2.ITF,$HFMSK+2 ;THE TIME IS NOW VALID BIT #H2.CLK,$HFMSK+2 ;TIME OF DAY CLOCK PRESENT ? BEQ 90$ ;IF EQ NO CALL $SETCK ;SET TIME IN THE CLOCK CHIP .ENDC ; DF R$$PRO 90$: RETURN ; ; THIS ROUTINE VALIDATES THE TIME PARAMETERS. IF THE C-BIT IS SET ; UPON ENTRY, IT IS ASSUMED THAT AN INVALID TIME PARAMETER WAS DETECTED. ; IF THE USER PARAMETER, POINTED TO BY R3, IS EQUAL TO -1, THE VALUE OF THE ; CURRENT TIME VECTOR IS USED. ONLY THE UPPER LIMIT IS CHECKED BY THIS ; ROUTINE BY COMPARING THE INPUT TIME PARAMETER WITH THE CORRESPONDING ; LIMIT IN THE $TKPS VECTOR. IF THIS CHECK FAILS THE C BIT IS SET ON ; RETURN. IN ANY CASE, THE NEW TIME PARAMETER IS MOVED INTO THE VECTOR ; ADDRESSED BY R5. ; 100$: BCS 40$ ;IF CS, ILLEGAL TIME PARAMETER HAS ;ALREADY BEEN DETECTED. MOV (R3),R0 ;GET TIME PARAMETER BPL 110$ ;IF PL, SO FAR SO GOOD CMP R0,#-1 ;OTHERWISE, IS IT A DEFAULTED PARAMETER? BNE 40$ ;IF NE NO, NEGATIVE VALUES ARE NOT VALID ;TIME PARAMETERS. NOTE THAT THE HIGH LIMIT ;FOR THE YEAR PARAMETER CORRESPONDS TO THE ;YEAR 2128. THIS SEEMINGLY RESTRICTIVE HIGH ;LIMIT PREVENTS USERS FROM SPECIFYING THEIR ;YEAR PARAMETER BASED ON ZERO, RATHER THAN ;THE YEAR 1900. MOV (R5),R0 ;USE CURRENT TIME VECTOR TO SUPPLY DEFAULT 110$: TST (R3)+ ;ADJUST POINTER TO NEXT TIME PARAMETER CMP (R1)+,R0 ;SET C BIT FOR OUT_OF_RANGE PARAMETER BNE 120$ SEC 120$: MOV R0,(R5)+ ;MOVE NEW TIME PARAMETER TO TIME VECTOR ;ON STACK. RETURN .END